home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib25 / div.c < prev    next >
C/C++ Source or Header  |  1992-05-31  |  930b  |  47 lines

  1. /*
  2.  * div and ldiv
  3.  *    this one should be compat with -fpcc-struct-return
  4.  *
  5.  *    ++jrb    bammi@dsrgsun.ces.cwru.edu
  6.  */
  7. #include <stdlib.h>
  8.  
  9. long __divsi3(long, long);    /* returns: quot in d0.l  remainder in d1.l */
  10.  
  11. #ifdef __MSHORT__
  12. div_t div(int num, int denom)
  13. {
  14.     div_t     result;
  15.  
  16.     __asm__ volatile("\
  17.         divs    %4,%3    | %3/%2 must be a data reggie
  18.         movw    %2,%0    | %2<31:16> == rem    %2<15:0> == quot
  19.         swap    %2
  20.         movw    %2,%1"
  21.         : "=g"(result.quot), "=g"(result.rem), "=d"((long)num)
  22.         : "2"((long)num), "d"(denom)
  23.         );
  24.  
  25.     return result;
  26. }
  27. #else /* !__MSHORT__ */
  28. __asm__(".stabs \"_div\",5,0,0,_ldiv");
  29. #endif
  30.  
  31. ldiv_t ldiv(long num, long denom)
  32. {
  33.     ldiv_t    result;
  34.  
  35.     __asm__ volatile("\
  36.          movl    %3,sp@-
  37.         movl    %2,sp@-
  38.         jsr    ___divsi3
  39.         addqw    #8,sp
  40.         movl    d0,%0
  41.         movl    d1,%1"
  42.         : "=g"(result.quot), "=g"(result.rem)
  43.         : "r"(num), "r"(denom)
  44.         ); /* compiler dependency, dont tell gcc about d0,d1 clobb */
  45.     return result;
  46. }
  47.